
#pragma once

#include "base_noncopyable.h"
#include <stddef.h>
#include <stdint.h>

namespace El {
namespace Base {

class Buffer {
    DISALLOW_COPY_AND_MOVE(Buffer);

public:
    Buffer();
    ~Buffer();

    /// \param buffer 追加的数据指针
    /// \param length 追加的数据长度
    /// \return 实际写入的数据
    uint32_t PutBuffer(const uint8_t *buffer, uint32_t length);

    /// 取数据地址
    uint8_t *GetBuffer() const;

    /// 取有效数据长度
    uint32_t GetLength() const;

    /// \param size 新的有效数据长度
    void Resize(uint32_t size);

    /// 取缓存容量
    uint32_t Capacity() const;

    /// \param Capacity 新的缓存容量
    void Reserve(uint32_t Capacity);

    /// 释放缓存,重置为构造时的初始状态
    void Reset();

    /// 设置每次动态增长的大小
    void SetIncreasedSize(uint32_t increase);

private:
    struct Internal;
    Internal *internal_;
};

} // namespace Base
} // namespace El
